package com.exampleyyy.demoyyy.GouLv;

import com.alibaba.fastjson.JSON;
import com.exampleyyy.demoyyy.common.BaseContext;
import com.exampleyyy.demoyyy.common.R;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.regex.Pattern;

@Slf4j
@WebFilter(filterName = "neidianziGouLV ",urlPatterns = "/*")
public class LoginCheckGuolv implements Filter {
    String[] BaiMingDan = new String[]{
            "/employee/login",
            "/employee/logout",
            "/backend/.*?",
            "/front/.*?",
            "/user/sendMsg",
            "/user/login",
            "/user/loginout",
            "/common/.*?",
            "/category/list",
            "/dish/list",
            "/",  // 过滤器放行 /
            "/admin"  // 过滤器放行 /admin

    };
    /**
     * 自定义过滤器的过滤方法
     * 该方法重写了doFilter方法，用于拦截和处理HTTP请求
     * 主要功能是检查请求的URI是否在白名单中，如果在白名单中则允许请求继续处理，否则阻止请求
     *
     * @param QingQiu   表示进入过滤器的ServletRequest对象，类型转换前
     * @param XiangYing 表示进入过滤器的ServletResponse对象，类型转换前
     * @param FangXing  表示过滤器链，用于调用下一个过滤器或请求目标
     * @throws IOException           在IO操作时抛出异常
     * @throws ServletException    在Servlet请求处理时抛出异常
     */
    @Override
    public void doFilter(ServletRequest QingQiu, ServletResponse XiangYing, FilterChain FangXing) throws IOException, ServletException {
        // 将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse类型
        HttpServletRequest request = (HttpServletRequest) QingQiu;
        HttpServletResponse response = (HttpServletResponse) XiangYing;
        // 获取请求的URI
        String realURI = request.getRequestURI();
        // 打印获取的URI地址
        System.out.println("获取的RUI地址是 = " + realURI);
        // 遍历白名单中的每个URL模式
        for (String meiyige : BaiMingDan) {
            // 使用正则表达式匹配请求的URI与白名单中的条目
            boolean result = Pattern.matches(meiyige, realURI);
            // 如果匹配成功，说明请求的URI在白名单中
            if (result) {
                // 调用过滤器链的doFilter方法，允许请求继续
                FangXing.doFilter(request, response);
                // 打印消息，指示该URI是允许通过的
                System.out.println("这个地址是放行地址，在白名单中" + realURI);
                // 结束过滤器方法的执行，返回控制权
                return;
            }
        }
        if(request.getSession().getAttribute("员工信息id")!=null){
            System.out.println("这个地址不在白名单中，处于登录状态，放行"+realURI);

            Long empid = (Long) request.getSession().getAttribute("员工信息id");
            System.out.println("empid"+empid);
            BaseContext.setCurrentId(empid);

            FangXing.doFilter(request,response);
            return;
        }
        // 判断用户是否登录
        if (request.getSession().getAttribute("用户信息ID") != null){
            log.info("用户已登录，用户id为："+request.getSession().getAttribute("用户信息ID"));
            //将id存入线程变量a
            Long userid = (Long) request.getSession().getAttribute("用户信息ID");
            System.out.println("userid"+userid);
            BaseContext.setCurrentId(userid);
            FangXing.doFilter(request,response);
        }
        else {
            System.out.println("这个地址是不在白名单中,处于未登录状态,拦截" + realURI);
            response.getWriter().write(JSON.toJSONString(R.error(0, "notlogin", null)));
        }
    }
}
